package com.huawei.controller;

import java.util.ArrayDeque;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;

/**
 * description
 *
 * @author cwx1134046
 * @since 2023-03-03
 */
public class PrintTask {
    /**
     *
     * ■ 题目描述
     *
     * 某个打印机根据打印队列执行打印任务。打印任务分为九个优先级，分别用数字1-9表示，数字越大优先级越高。打印机每次从队列头部取出第一个任务A，
     * 然后检查队列余下任务中有没有比A优先级更高的任务，如果有比A优先级高的任务，则将任务A放到队列尾部，否则就执行任务A的打印。
     * 请编写一个程序，根据输入的打印队列，输出实际的打印顺序。
     * 输入描述
     *
     * 输入一行，为每个任务的优先级，优先级之间用逗号隔开，优先级取值范围是1~9。
     * 输出描述
     *
     * 输出一行，为每个任务的打印顺序，打印顺序从0开始，用逗号隔开
     * 示例 1 输入输出示例仅供调试，后台判题数据一般不包含示例
     *
     * 输入
     *
     * 9,3,5,1,5,9,5
     *
     * 输出
     *
     * 0,2,1
     *
     * 说明
     *
     * 队列头部任务的优先级为9，最先打印，故序号为0；
     * 接着队列头部任务优先级为3，队列中还有优先级为5的任务，优先级3任务被移到队列尾部；
     * 接着打印优先级为5的任务，故其序号为1；
     * 最后优先级为3的任务的序号为2。
     */

    public static int[] printTask(int[] priority) {
        Queue<int[]> queue = new ArrayDeque<>();
        int[] res = new int[priority.length];
        PriorityQueue<int[]> priorityQueue = new PriorityQueue<>((a, b) -> {
            if (a[0] == b[0]) {
                return a[1] - b[1];
            }
            return b[0] - a[0];
        });

        for (int i =0 ;i < priority.length; i ++) {
            priorityQueue.add(new int[]{priority[i],i});
            queue.add(new int[]{priority[i],i});
        }
        int resIndex = 0;
        while (!queue.isEmpty()) {
            int[] poll = queue.poll();
            int[] peek = priorityQueue.peek();
            if(poll[0] != peek[0]) {
                queue.add(poll);
            }else{
                res[resIndex ++] =  poll[1];
                priorityQueue.poll();
            }
        }
        return res;
    }

    public static void main(String[] args) {
        int[] ints = printTask(new int[]{9,3,5,1,5,9,5});
        for (int i: ints) {
            System.out.println(i);
        }
    }
}
